// PLC通过队列服务读取和写入变量使用示例
const plcService = require('../client/src/services/plcService');

// 示例：通过队列服务控制仓库温度
async function controlWarehouseTemperature() {
  console.log('=== 仓库温度控制示例 ===');
  
  try {
    // 1. 定义要操作的PLC变量
    const TEMPERATURE_VARIABLE = 'DB1,W0.0';  // 温度变量地址
    const HUMIDITY_VARIABLE = 'DB1,W2.0';     // 湿度变量地址
    const SYSTEM_STATUS_VARIABLE = 'DB1,W6.0'; // 系统状态变量地址
    
    // 2. 通过队列服务读取当前环境数据
    console.log('1. 读取当前环境数据...');
    const environmentData = await plcService.readVariables(
      [TEMPERATURE_VARIABLE, HUMIDITY_VARIABLE], 
      true // 使用队列服务
    );
    
    const currentTemperature = environmentData[TEMPERATURE_VARIABLE];
    const currentHumidity = environmentData[HUMIDITY_VARIABLE];
    
    console.log(`   当前温度: ${currentTemperature}°C`);
    console.log(`   当前湿度: ${currentHumidity}%`);
    
    // 3. 根据读取的数据决定是否需要调整
    let targetTemperature = 25; // 目标温度25°C
    let temperatureAdjustmentNeeded = false;
    
    if (currentTemperature < targetTemperature - 2) {
      console.log('   温度过低，需要加热');
      temperatureAdjustmentNeeded = true;
    } else if (currentTemperature > targetTemperature + 2) {
      console.log('   温度过高，需要制冷');
      temperatureAdjustmentNeeded = true;
    } else {
      console.log('   温度正常，无需调整');
    }
    
    // 4. 如果需要调整温度，通过队列服务写入控制命令
    if (temperatureAdjustmentNeeded) {
      console.log('2. 发送温度控制命令...');
      
      // 这里我们模拟发送控制命令到PLC
      // 实际应用中，这里可能是写入控制继电器或调用特定的控制程序
      const controlCommand = currentTemperature < targetTemperature ? 1 : 2; // 1=加热, 2=制冷
      const CONTROL_VARIABLE = 'DB1,W10.0'; // 控制命令变量地址
      
      const writeResult = await plcService.writeVariable(CONTROL_VARIABLE, controlCommand);
      console.log(`   控制命令已发送: ${controlCommand}`, writeResult);
      
      // 更新系统状态
      const statusUpdateResult = await plcService.writeVariable(SYSTEM_STATUS_VARIABLE, 1); // 1=正在调整温度
      console.log('   系统状态已更新为"正在调整温度"', statusUpdateResult);
    }
    
    // 5. 再次读取确认数据
    console.log('3. 确认操作结果...');
    const confirmData = await plcService.readVariables(
      [TEMPERATURE_VARIABLE, HUMIDITY_VARIABLE, SYSTEM_STATUS_VARIABLE], 
      true // 使用队列服务
    );
    
    console.log(`   确认温度: ${confirmData[TEMPERATURE_VARIABLE]}°C`);
    console.log(`   确认湿度: ${confirmData[HUMIDITY_VARIABLE]}%`);
    console.log(`   系统状态: ${confirmData[SYSTEM_STATUS_VARIABLE]}`);
    
    console.log('✅ 温度控制示例完成');
  } catch (error) {
    console.error('❌ 温度控制示例执行失败:', error);
  }
}

// 示例：通过队列服务进行批量变量操作
async function batchVariableOperations() {
  console.log('\n=== 批量变量操作示例 ===');
  
  try {
    // 1. 定义一批要操作的变量
    const variables = [
      'DB1,W0.0',  // 温度
      'DB1,W2.0',  // 湿度
      'DB1,W4.0',  // 货架1状态
      'DB1,W6.0',  // 系统状态
      'DB1,W8.0',  // 报警状态
      'DB1,W10.0', // 控制命令
      'DB1,W12.0', // 备用状态1
      'DB1,W14.0'  // 备用状态2
    ];
    
    // 2. 通过队列服务批量读取所有变量
    console.log('1. 批量读取所有变量...');
    const allValues = await plcService.readVariables(variables, true); // 使用队列服务
    console.log('   读取结果:', allValues);
    
    // 3. 批量写入新值
    console.log('2. 批量写入新值...');
    const writeOperations = [];
    
    for (let i = 0; i < variables.length; i++) {
      const variable = variables[i];
      let newValue;
      
      // 根据变量类型生成不同的测试值
      if (variable.includes('W0.0') || variable.includes('W2.0')) {
        // 温度和湿度：随机数值
        newValue = Math.floor(Math.random() * 100);
      } else if (variable.includes('W4.0') || variable.includes('W12.0') || variable.includes('W14.0')) {
        // 状态变量：布尔值
        newValue = Math.random() > 0.5;
      } else {
        // 其他变量：随机整数
        newValue = Math.floor(Math.random() * 10);
      }
      
      // 通过队列服务写入
      const writePromise = plcService.writeVariable(variable, newValue);
      writeOperations.push({
        variable,
        value: newValue,
        promise: writePromise
      });
      
      console.log(`   准备写入 ${variable} = ${newValue}`);
    }
    
    // 4. 等待所有写入操作完成
    console.log('3. 执行所有写入操作...');
    const writeResults = [];
    for (const op of writeOperations) {
      try {
        const result = await op.promise;
        writeResults.push({ variable: op.variable, value: op.value, success: true, result });
        console.log(`   ✅ ${op.variable} 写入成功: ${op.value}`);
      } catch (error) {
        writeResults.push({ variable: op.variable, value: op.value, success: false, error: error.message });
        console.log(`   ❌ ${op.variable} 写入失败:`, error.message);
      }
    }
    
    // 5. 验证写入结果
    console.log('4. 验证写入结果...');
    const verifyValues = await plcService.readVariables(variables, true); // 使用队列服务
    
    let allVerified = true;
    for (const op of writeOperations) {
      if (op.success) {
        const expectedValue = op.value;
        const actualValue = verifyValues[op.variable];
        
        // 对于数值类型，允许小误差
        let isMatch = false;
        if (typeof expectedValue === 'number' && typeof actualValue === 'number') {
          isMatch = Math.abs(expectedValue - actualValue) < 0.0001;
        } else {
          isMatch = expectedValue === actualValue;
        }
        
        if (isMatch) {
          console.log(`   ✅ ${op.variable}: 期望值 ${expectedValue} === 实际值 ${actualValue}`);
        } else {
          console.log(`   ❌ ${op.variable}: 期望值 ${expectedValue} !== 实际值 ${actualValue}`);
          allVerified = false;
        }
      }
    }
    
    if (allVerified) {
      console.log('✅ 所有批量操作验证通过');
    } else {
      console.log('⚠️ 部分批量操作验证失败');
    }
    
    console.log('✅ 批量变量操作示例完成');
  } catch (error) {
    console.error('❌ 批量变量操作示例执行失败:', error);
  }
}

// 运行所有示例
async function runAllExamples() {
  console.log('开始运行PLC队列服务使用示例...\n');
  
  await controlWarehouseTemperature();
  await batchVariableOperations();
  
  console.log('\n🎉 所有示例运行完成!');
}

// 执行示例
runAllExamples();